#include<memory.h>


char*  strtok_r2(char* string_org,const char* demial,char** last)
{
    const char* spanp; //span表示分隔，p表示指针
    char c, sc; //c表示char字符，sc表示 span char
    char* tok;  //token表示分隔的段

//当开始结尾都为NULL的时候，说明没有字符被查找，所以返回NULL
    if (string_org == NULL  && (string_org = *last) == NULL)
    {
        return (NULL);
    }

//由goto组成的循环是在扫描字符串的时候，当遇到所需要匹配的字符时，略过这个字符。
count:
    c = *string_org++;

    for (spanp = demial; (sc = *spanp++) != 0; )
    {
        if (c == sc)
        {
            goto count;
        }
    }

//下一个字符为0，则表示到达了搜索结果，把last置为NULL，并返回NULL
    if (c == 0)
    {
        *last = NULL;
        return (NULL);
    }

//把原始的字符串指针回退。
    tok = string_org -1;

//开始扫描字符串中是否含有要匹配的字符，之后把这个匹配字符之前的部分返回。
//这看似是个无限循环，但当源字符串和匹配字符串都走到结尾时，也就是string_org和sc都为NULL时，最外层循环最后会走到return(tok)结束循环。
    for (;;)
    {
        c = *string_org++;
        spanp = demial;

        do
        {
            if ((sc = *spanp++) == c)
            {
                if (c == 0)
                {
                    string_org = NULL;
                }
                else
                {
                    string_org[-1] = 0;
                }
                *last = string_org;
                return (tok);
            }
        }
        while (sc != 0);
    }

}
//把last设置为一个静态局部变量来保存余下内容的地址。
char * strtok2(char *s, const char *delim)
{
    static char *lasts;
    return strtok_r2(s, delim, &lasts);
}

//*/

void main()
{
    char source[]="abc**def**ghi**jkl";
    char* slim="****";
    char* p;
    printf("%s\n",strtok2(source,slim));
    while((p=strtok2(NULL,slim))!=NULL)
    printf("%s\n",p);

    printf("%d\n",'a');
}
